

// 泛型 在定义的时候无法确定类型，只有在使用的时候才能确定类型 -》 使用泛型了

interface IArray1<T> { // 形参来接受
    [key:number]:T// “string”、“number”、“symbol
}
// 能用type 用type 用不了就用接口
type IArray<T> = {
    [key:number]:T
}
let arr1:IArray<number> = [1,2,3]; // 实参
let arr2:Array<string> = ['1','2']; // 实参


// 接口中限制类的抽象属性和方法 指代的是类中的原型方法或者实例方法


// -------------------------------安全层面-------------------------------------
// ts中的类型： 基本类型 string | number | boolean | 数组 | 元组 | null | undefined
// 普通枚举 -> 最终转化的就是一个对象   常量枚举 -> 最终转化的结果就是对应的值  枚举的索引是递增的 也可以自定义值  函数的返回值void (严格模式下 不能将null赋予给其他类型，undefined可以赋予void)
// never (永远无法到达的 完整性保护)
// bigint symbol 

// object对象类型  any任意类型  能不用就不用any

// string | number  => string和number的公共方法
// 类型可以做联合类型 （默认只能调用公共方法） 除非你赋予了具体值后可以调用自身的方法
// 字面量类型  可以用值来做类型. 
// 通过type来起别名， 可以使用联合类型   interface区别 (不能使用联合类型) 可以继承 可以被实现

// 断言：  非空断言  ! 主动放弃了ts的检测  类型强制转化  (? / ?? )
// 函数 函数声明的方式 表达式 （考虑兼容性 要把一个函数赋予给这个变量） 、 function关键字， 主要考虑参数和返回值  （参数可以支持默认参数 可选参数 任一参数） 函数的重载ts

// 类:类型/值  用作类型主要描述的是实例 let a:String = new String()
// 用法和es6 基本一致 （修饰符 限制使用范围 public private protected） 在ts中声明的属性必须要提前在类中声明 修饰符 readonly (在初始化的时候可以修改)  （装饰器）

// 接口  接口是用来描述形状的 ，也可以用来描述函数 （描述函数和函数的属性 混合接口）  不能有具体实现，都是抽象的
// 可以描述对象 可以描述函数 可以描述类中的属性和方法

// 接口中可以增加表示符号 ? 选填的属性 readonly 仅读的属性  任意类型 [xx:string]:any
// 接口可以extends接口  接口可以继承类 类可以实现口 （类也是类型）
// abstract 抽象类中可以涵盖抽象的属性和方法（自己不实现让子类来实现）  抽象类不能被new

// 泛型： 使用的时候传递类型




export {}